package com.gzist.zzchatroomserver.common;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
 * 通用结果类，用于封装 API 的返回结果。
 * @param <T> 数据类型
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    private static final int SUCCESS_CODE = 200;
    private static final int ERROR_CODE = 500;

    /**
     * 状态码：200 表示成功，其他表示失败。
     */
    private Integer code;

    /**
     * 消息或错误信息。
     */
    private String msg;

    /**
     * 返回的数据。
     */
    private T data;

    /**
     * 创建一个成功的 Result 对象，不包含额外的消息。
     * @param object 数据对象
     * @param <T> 数据类型
     * @return 成功的 Result 对象
     */
    public static <T> Result<T> success(T object) {
        return Result.<T>builder()
                .code(SUCCESS_CODE)
                .msg("操作成功")
                .data(object)
                .build();
    }

    /**
     * 创建一个成功的 Result 对象，包含数据和消息。
     * @param object 数据对象
     * @param msg 成功消息（可选）
     * @param <T> 数据类型
     * @return 成功的 Result 对象
     */
    public static <T> Result<T> success(T object, String msg) {
        return Result.<T>builder()
                .code(SUCCESS_CODE)
                .msg(msg != null ? msg : "操作成功")
                .data(object)
                .build();
    }

    /**
     * 创建一个成功的 Result 对象，仅包含消息。
     * @param msg 成功消息
     * @param <T> 数据类型
     * @return 成功的 Result 对象
     */
    public static <T> Result<T> success(String msg) {
        return Result.<T>builder()
                .code(SUCCESS_CODE)
                .msg(msg)
                .build();
    }

    /**
     * 创建一个失败的 Result 对象。
     * @param msg 错误信息
     * @param <T> 数据类型
     * @return 失败的 Result 对象
     */
    public static <T> Result<T> error(String msg) {
        return Result.<T>builder()
                .code(ERROR_CODE)
                .msg(msg)
                .build();
    }
}
